{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from openai import OpenAI\n",
    "\n",
    "client = OpenAI(\n",
    "    api_key=\"ollama\",\n",
    "    base_url=\"http://192.168.20.43:11434/v1\"\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 简单版本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "False，未明确日常维护的具体要求。\n"
     ]
    }
   ],
   "source": [
    "def llm_RAG_filter(query, context_str):\n",
    "    prompt = \"\"\n",
    "\n",
    "    query_new = f\"\"\"\n",
    "    ---------------------\\\n",
    "    # OBJECTIVE #\\\n",
    "    你的任务是判断<context>是否提供了足够的信息来回答<query>。请遵循以下严格的判断步骤：\\\n",
    "    1.仔细阅读<context>，禁止对<context>的内容做任何理解、分析、推断和延展；禁止对语境或场景进行推断和延展。\n",
    "    2.仅思考<context>和<query>之间的相关性。\n",
    "    若<context>中未提供具体细节来回答<query>，请回复\"False\"；若<context>中无须推断就包括了具体细节来回答<query>，请回复\"True\"。并给出不超过10个字的理由。\\\n",
    "    ----------------\\\n",
    "    <context>: 纽约是美国的大城市。\\\n",
    "    <query>: 请告诉我中国的全称？\\\n",
    "    <ai>: False，未提供关于中国全称的相关信息。\n",
    "    \n",
    "    <context>: 猫是胎生动物，鱼是卵生动物。猫和鱼不是同一种类的动物。\\\n",
    "    <query>: 猫和鱼是同一种类的动物么？\\\n",
    "    <ai>: True，已经明确指出“猫和鱼不是同一种类的动物”，这直接回\\答了查询“猫和鱼是同一种类的动物么？\\\n",
    "\n",
    "    <context>:{context_str}\\\n",
    "    <query>: {query}\\\n",
    "    <ai>: \n",
    "    \"\"\"\n",
    "    completion = client.chat.completions.create(\n",
    "        model=\"qwen2.5:14b\",\n",
    "        messages=[{'role': 'system', 'content': prompt},\n",
    "                  {'role': 'user', 'content': query_new}],\n",
    "        )\n",
    "    return completion.choices[0].message.content\n",
    "\n",
    "\n",
    "# 测试用例\n",
    "context_str1 = \"\"\"\n",
    "section 1 start:石油和天然气作为重要的能源资源，在全球油气田公司应建立并完善管道巡护制度，对高后果区和高风险段加密巡线周期。高后果区和高风险段管道每日巡检次数宜不低于一次；宜采用GPS等手段，靠近管道中心线进行巡检，以保证巡线质量；难以实施人工巡线和长距离管道可采用无人机巡线经济和人们的日常生活中发挥着至关重要的作用。从驱动汽车、供暖到为工业生产提供动力，油气的身影无处不在。了解油气知识，对石油工作者很重要 sction 1 ends.\n",
    "\"\"\"\n",
    "\n",
    "query = \"日常维护有哪些要求\"   \n",
    "bool_contextIsEnough = llm_RAG_filter(query,context_str1) \n",
    "print(bool_contextIsEnough)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 一次性判断版本"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 2, 3, 4]\n",
      "\n",
      "理由：所有<context>中的信息都是关于油田集输管道的内检测，而不是针对气田集输管道。因此这些内容对于回答有关气田集输管道如何进行内检测的问题没有帮助。需要注意的是，油田和气田使用的手册不同，需要参考专门针对气田集输管道的相关手册来正确回答这个问题。\n"
     ]
    }
   ],
   "source": [
    "import ollama\n",
    "client = ollama.Client(host='http://192.168.20.43:11434')\n",
    "\n",
    "def llm_RAG_filter(query, context_str):\n",
    "    prompt = \"\"\n",
    "\n",
    "    query_new = f\"\"\"\n",
    "    ---------------------\\\n",
    "    ## OBJECTIVE \\\n",
    "    为了精简<context>并删除无益于回答<query>的信息。\n",
    "    你的任务是判断哪些<context>中的信息对于回答<query>没有帮助，并找出其序号。请遵循以下严格的判断步骤：\\\n",
    "    1.仔细阅读<context>，思考<context>和<query>之间的相关性。\n",
    "    2.找出回答<query>无需使用的<context>的序号，以数组形式输出。\n",
    "    3.阅读文档名称，确保文档与<query>相关。特别记住：油田（输油）、气田（输气）与站场这三者使用了三个不同的手册，注意加以区分。\n",
    "\n",
    "    ## 约束\n",
    "    - 输出数字后，记得给出理由。\n",
    "    \n",
    "    ## EXAMPLE\n",
    "    ### EXAMPLE_1\n",
    "    <context_1>纽约是美国的大城市。\\\n",
    "    <context_2>中国的全称是中华人民共和国。\n",
    "    <query>请告诉我中国的全称？\\\n",
    "    <ai>[1]\n",
    "\n",
    "    ### EXAMPLE_2\n",
    "    <context_1>猫是胎生动物，鱼是卵生动物。猫和鱼不是同一种类的动物。\\\n",
    "    <context_2>熊猫是胎生动物。\n",
    "    <context_3>小熊猫是胎生动物。\n",
    "    <query>:猫和鱼是同一种类的动物么？\\\n",
    "    <ai>[2,3] \\\n",
    "    \n",
    "    ## TASK\n",
    "    {context_str}\\\n",
    "    <query>{query}\\\n",
    "    <ai>\n",
    "    \"\"\"\n",
    "    response = client.generate(\n",
    "        model='qwen2.5:14b', \n",
    "        prompt=query_new,\n",
    "        options={\"num_ctx\": 32768},  \n",
    "    )\n",
    "    return response['response']\n",
    "\n",
    "\n",
    "# 测试用例\n",
    "context_str1 = \"\"\"\n",
    "<context_1>\n",
    "2.中国石油天然气股份有限公司油田集输管道检测评价及修复技术导则-20170707.docx\n",
    "6.1 内检测\\n集输管道的内检测开展应依据GB/T 27699-2011《钢质管道内检测技术规范》、SY/T 6597-2014《油气管道内检测技术规范》和Q/SY 1267-2010《钢质管道内检测开挖验证规范》等标准进行。\\n基于风险的内检测即通过综合考虑风险评价建议和管道缺陷特征等确定需要选择的检测器类型，并制定内检测计划，其检验流程如下图6-1所示。\\n图6-1 内检测流程\\n应调查并详细填写目标管道调查表，见GB/T 27699-2011的附录C或者SY/T 6889-2012的附录D。\\n管道、收发球筒、三通、弯头应满足GB/T 27699-2011的4节、SY/T 6889-2012的5.4节或检测器所需性能要求，如果管道上打有堵漏抢险的楔子，应换管或采用其他非侵入式堵漏方法。内检测器设备选择及技术指标要求参见GB/T 27699-2011的附录B、SY/T 6889-2012的附录C。对不满足要求的管道及附件应进行改造或更换。\\n检测完成后，宜对检测到的每类缺陷分别选取一定数量进行开挖验证，以验证内检测质量，确定管道真实状况。\\n针对内检测发现的每类缺陷应分别进行里程、深度、时钟方位等属性参数的统计分析，总结缺陷分布与发展规律，制定风险减缓措施。\\n应对内检测发现的金属损失、制造缺陷等缺陷进行剩余强度评价和剩余寿命预测，详见6.6。\\n应根据缺陷适用性评价结果确定合适的再检测周期，对于不满足管道安全运行要求的缺陷制定修复计划。制定缺陷修复计划时，应预测腐蚀缺陷的每年发展，进行腐蚀发展后的适用性评价，制定在再检测周期内的每年腐蚀缺陷修复计划。\\n内检测的检测报告应包括如下内容：\\n1）管道信息；\\n2）内检测质量；\\n3）缺陷统计数据汇总；\\n4）金属损失统计；\\n5）管道异常、缺陷列表；\\n6）严重缺陷汇总表；\\n7）管道检测报告规格；\\n8）开挖检测表单；\\n9）内检测系统性能规格。\\n\n",
    "<context_2>\n",
    "2.中国石油天然气股份有限公司油田集输管道检测评价及修复技术导则-20170707.docx\n",
    "6.1 内检测\\n集输管道的内检测开展应依据GB/T 27699-2011《钢质管道内检测技术规范》、SY/T 6597-2014《油气管道内检测技术规范》和Q/SY 1267-2010《钢质管道内检测开挖验证规范》等标准进行。\\n基于风险的内检测即通过综合考虑风险评价建议和管道缺陷特征等确定需要选择的检测器类型，并制定内检测计划，其检验流程如下图6-1所示。\\n图6-1 内检测流程\\n应调查并详细填写目标管道调查表，见GB/T 27699-2011的附录C或者SY/T 6889-2012的附录D。\\n管道、收发球筒、三通、弯头应满足GB/T 27699-2011的4节、SY/T 6889-2012的5.4节或检测器所需性能要求，如果管道上打有堵漏抢险的楔子，应换管或采用其他非侵入式堵漏方法。内检测器设备选择及技术指标要求参见GB/T 27699-2011的附录B、SY/T 6889-2012的附录C。对不满足要求的管道及附件应进行改造或更换。\\n检测完成后，宜对检测到的每类缺陷分别选取一定数量进行开挖验证，以验证内检测质量，确定管道真实状况。\\n针对内检测发现的每类缺陷应分别进行里程、深度、时钟方位等属性参数的统计分析，总结缺陷分布与发展规律，制定风险减缓措施。\\n应对内检测发现的金属损失、制造缺陷等缺陷进行剩余强度评价和剩余寿命预测，详见6.6。\\n应根据缺陷适用性评价结果确定合适的再检测周期，对于不满足管道安全运行要求的缺陷制定修复计划。制定缺陷修复计划时，应预测腐蚀缺陷的每年发展，进行腐蚀发展后的适用性评价，制定在再检测周期内的每年腐蚀缺陷修复计划。\\n内检测的检测报告应包括如下内容：\\n1）管道信息；\\n2）内检测质量；\\n3）缺陷统计数据汇总；\\n4）金属损失统计；\\n5）管道异常、缺陷列表；\\n6）严重缺陷汇总表；\\n7）管道检测报告规格；\\n8）开挖检测表单；\\n9）内检测系统性能规格。\\n\n",
    "<context_3>\n",
    "2.中国石油天然气股份有限公司油田集输管道检测评价及修复技术导则-20170707.docx\n",
    "6.1 内检测\\n集输管道的内检测开展应依据GB/T 27699-2011《钢质管道内检测技术规范》、SY/T 6597-2014《油气管道内检测技术规范》和Q/SY 1267-2010《钢质管道内检测开挖验证规范》等标准进行。\\n基于风险的内检测即通过综合考虑风险评价建议和管道缺陷特征等确定需要选择的检测器类型，并制定内检测计划，其检验流程如下图6-1所示。\\n图6-1 内检测流程\\n应调查并详细填写目标管道调查表，见GB/T 27699-2011的附录C或者SY/T 6889-2012的附录D。\\n管道、收发球筒、三通、弯头应满足GB/T 27699-2011的4节、SY/T 6889-2012的5.4节或检测器所需性能要求，如果管道上打有堵漏抢险的楔子，应换管或采用其他非侵入式堵漏方法。内检测器设备选择及技术指标要求参见GB/T 27699-2011的附录B、SY/T 6889-2012的附录C。对不满足要求的管道及附件应进行改造或更换。\\n检测完成后，宜对检测到的每类缺陷分别选取一定数量进行开挖验证，以验证内检测质量，确定管道真实状况。\\n针对内检测发现的每类缺陷应分别进行里程、深度、时钟方位等属性参数的统计分析，总结缺陷分布与发展规律，制定风险减缓措施。\\n应对内检测发现的金属损失、制造缺陷等缺陷进行剩余强度评价和剩余寿命预测，详见6.6。\\n应根据缺陷适用性评价结果确定合适的再检测周期，对于不满足管道安全运行要求的缺陷制定修复计划。制定缺陷修复计划时，应预测腐蚀缺陷的每年发展，进行腐蚀发展后的适用性评价，制定在再检测周期内的每年腐蚀缺陷修复计划。\\n内检测的检测报告应包括如下内容：\\n1）管道信息；\\n2）内检测质量；\\n3）缺陷统计数据汇总；\\n4）金属损失统计；\\n5）管道异常、缺陷列表；\\n6）严重缺陷汇总表；\\n7）管道检测报告规格；\\n8）开挖检测表单；\\n9）内检测系统性能规格。\\n\n",
    "<context_4>\n",
    "2.中国石油天然气股份有限公司油田集输管道检测评价及修复技术导则-20170707.docx\n",
    "6.1 内检测\\n集输管道的内检测开展应依据GB/T 27699-2011《钢质管道内检测技术规范》、SY/T 6597-2014《油气管道内检测技术规范》和Q/SY 1267-2010《钢质管道内检测开挖验证规范》等标准进行。\\n基于风险的内检测即通过综合考虑风险评价建议和管道缺陷特征等确定需要选择的检测器类型，并制定内检测计划，其检验流程如下图6-1所示。\\n图6-1 内检测流程\\n应调查并详细填写目标管道调查表，见GB/T 27699-2011的附录C或者SY/T 6889-2012的附录D。\\n管道、收发球筒、三通、弯头应满足GB/T 27699-2011的4节、SY/T 6889-2012的5.4节或检测器所需性能要求，如果管道上打有堵漏抢险的楔子，应换管或采用其他非侵入式堵漏方法。内检测器设备选择及技术指标要求参见GB/T 27699-2011的附录B、SY/T 6889-2012的附录C。对不满足要求的管道及附件应进行改造或更换。\\n检测完成后，宜对检测到的每类缺陷分别选取一定数量进行开挖验证，以验证内检测质量，确定管道真实状况。\\n针对内检测发现的每类缺陷应分别进行里程、深度、时钟方位等属性参数的统计分析，总结缺陷分布与发展规律，制定风险减缓措施。\\n应对内检测发现的金属损失、制造缺陷等缺陷进行剩余强度评价和剩余寿命预测，详见6.6。\\n应根据缺陷适用性评价结果确定合适的再检测周期，对于不满足管道安全运行要求的缺陷制定修复计划。制定缺陷修复计划时，应预测腐蚀缺陷的每年发展，进行腐蚀发展后的适用性评价，制定在再检测周期内的每年腐蚀缺陷修复计划。\\n内检测的检测报告应包括如下内容：\\n1）管道信息；\\n2）内检测质量；\\n3）缺陷统计数据汇总；\\n4）金属损失统计；\\n5）管道异常、缺陷列表；\\n6）严重缺陷汇总表；\\n7）管道检测报告规格；\\n8）开挖检测表单；\\n9）内检测系统性能规格。\\n\n",
    "\"\"\"\n",
    "\n",
    "query = \"气田集输管道如何进行管道内检测\"   \n",
    "bool_contextIsEnough = llm_RAG_filter(query,context_str1) \n",
    "print(bool_contextIsEnough)\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
